package com.hugoo.core.db.mo;

import com.hugoo.core.util.TL;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.Set;

/**
 *
 * @author Xinton
 */
public class Record extends HashMap {

    private static final String CLOB_PREX = "__CLOB__", BG_PREX = "BG_";

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        Set<String> st = super.keySet();
        sb.append("{");
        for (String k : st) {
            if (k.startsWith(CLOB_PREX)) {//增加拦截COLB数据值导入至JSON列表
                continue;
            }
            sb.append("\"").append(k).append("\":").append(DCV.getValueForJson(get(k))).append(",");
        }
        if (sb.length() > 2) {
            sb.replace(sb.length() - 1, sb.length(), "}");
        } else {
            sb.append('}');
        }
        return sb.toString();
    }

    private String getValue(String key) {
        return DCV.getValueForJson(get(key));
    }

    /**
     * 取得字段的值
     *
     * @param key 字段名
     * @return 成功返回字段的取值, 异常或失败返回 null
     */
    public Object get(String key) {
        if (key == null) {
            return null;
        } else {
            return super.get(key.toUpperCase());
        }
    }

    @Override
    public Object put(Object key, Object value) {
        if (value instanceof java.sql.Clob && key instanceof String) {
            super.put(CLOB_PREX + key, DCV.getValue(value));
        } else if (value instanceof java.math.BigDecimal) {
            super.put(BG_PREX + key, ((BigDecimal) value).doubleValue());
        }
        return super.put(key, value);
    }

    /**
     * 得到 String 类型的值
     *
     * @param key 字段名
     * @return String 类型的值
     */
    public String getString(String key) {
        Object obj = this.get(key);
        return DCV.getValue(obj);
    }

    /**
     * 得到 Timestamp 类型的值
     *
     * @param key 字段名
     * @return Timestamp 类型的值
     */
    public java.sql.Timestamp getTimestamp(String key) {
        Object obj = this.get(key);
        return (java.sql.Timestamp) obj;
    }

    public String getTimestampStr(String key, String pattern) {
        Timestamp obj = (Timestamp) this.get(key);
        return TL.format(obj, pattern);
    }

    public String getTimestampStr(String key) {
        return getTimestampStr(key, "yyyy-MM-dd");
    }

    /**
     * 得到 Date 类型的值
     *
     * @param key 字段名
     * @return Date 类型的值
     */
    public java.sql.Date getDate(String key) {
        Object obj = this.get(key);
        return (java.sql.Date) obj;
    }

    public String getDateStr(String key) {
        Object obj = this.get(key);

        return DCV.getValue(obj);
    }

    /**
     * 得到 Time 类型的值
     *
     * @param key 字段名
     * @return Time 类型的值
     */
    public java.sql.Time getTime(String key) {
        Object obj = this.get(key);
        return (java.sql.Time) obj;
    }

    /**
     * 得到 BigDecimal 类型的值
     *
     * @param key 字段名
     * @return BigDecimal 类型的值
     */
    public java.math.BigDecimal getBigDecimal(String key) {
        Object obj = this.get(key);
        return (java.math.BigDecimal) obj;
    }

    /**
     * 得到 Long 类型的值
     *
     * @param key 字段名
     * @return Long 类型的值
     */
    public java.lang.Long getLong(String key) {
        Object obj = this.get(key);
        return DCV.getLong(obj);
    }

    /**
     * 得到 Integer 类型的值
     *
     * @param key 字段名
     * @return Integer 类型的值
     */
    public java.lang.Integer getInteger(String key) {
        Object obj = this.get(key);
        return DCV.getInteger(obj);
    }

    /**
     * 得到 Short 类型的值
     *
     * @param key 字段名
     * @return Short 类型的值
     */
    public java.lang.Short getShort(String key) {
        Object obj = this.get(key);
        return DCV.getShort(obj);
    }

    /**
     * 得到 Double 类型的值
     *
     * @param key 字段名
     * @return Double 类型的值
     */
    public java.lang.Double getDouble(String key) {
        Object obj = this.get(key);
        return DCV.getDouble(obj);
    }

    /**
     * 得到 Float 类型的值
     *
     * @param key 字段名
     * @return Float 类型的值
     */
    public java.lang.Float getFloat(String key) {
        Object obj = this.get(key);
        return DCV.getFloat(obj);
    }

    /**
     * 得到 Boolean 类型的值
     *
     * @param key 字段名
     * @return Boolean 类型的值
     */
    public java.lang.Boolean getBoolean(String key) {
        Object obj = this.get(key);
        return (java.lang.Boolean) obj;
    }

    /**
     * 得到 Byte 类型的值
     *
     * @param key 字段名
     * @return Byte 类型的值
     */
    public java.lang.Byte getByte(String key) {
        Object obj = this.get(key);
        return (java.lang.Byte) obj;
    }

    /**
     * 得到 byte[] 类型的值
     *
     * @param key 字段名
     * @return byte[] 类型的值
     */
    public byte[] getBytes(String key) {
        Object obj = this.get(key);
        return (byte[]) obj;
    }

    /**
     * 得到 Blob 类型的值
     *
     * @param key 字段名
     * @return Blob 类型的值
     */
    public java.sql.Blob getBlob(String key) {
        Object obj = this.get(key);
        return (java.sql.Blob) obj;
    }

    /**
     * 得到 Clob 类型的值
     *
     * @param key 字段名
     * @return Clob 类型的值
     */
    public java.sql.Clob getClob(String key) {
        Object obj = this.get(key);
        return (java.sql.Clob) obj;
    }

    public String getClobStr(String key) {
        Object obj = this.get(key);
        return DCV.getValue(obj);
    }

    /**
     * 得到 Array 类型的值
     *
     * @param key 字段名
     * @return Array 类型的值
     */
    public java.sql.Array getArray(String key) {
        Object obj = this.get(key);
        return (java.sql.Array) obj;
    }

    /**
     * 得到 InputStream 类型的值
     *
     * @param key 字段名
     * @return InputStream 类型的值
     */
    public java.io.InputStream getBinaryStream(String key) {
        Object obj = this.get(key);
        return (java.io.InputStream) obj;
    }

    /**
     * 得到 Object 类型的值
     *
     * @param key 字段名
     * @return Object 类型的值
     */
    public Object getObject(String key) {
        return this.get(key);
    }
}
